package cnsatmsmart.automation.mmi.model.layers;

/**
 * @author SIK - PTIK, BPPT
 **/

import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.proj.Projection;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.io.Serializable;

public class OMLabelClover extends OMGraphic implements Serializable {
    /* const */
        private static final Color FIXES_COLOR = new Color (225, 225, 225, 100);
            //nilai warna default untuk pewarnaan pada penggambaran clover yang merupakan instance dari kelas OMLabelClover
        private static final int FIXES_SIZE = 16;
            //nilai sisi-sisi setengah diagonal default dari belah ketupat yang berada di dalam pada penggambaran clover yang merupakan instance dari kelas OMLabelClover
        private static final int NPOINTS = 4;
            //banyaknya jumlah titik sudut sebuah belah ketupat yang berada di dalam sebuah clover yang merupakan instance dari kelas OMLabelClover
    
    /* atribut - atribut yang dimiliki oleh kelas OMLabelClover */
        private float latitude;                     //posisi titik pusat object pada garis lintang
        private float longitude;                    //posisi titik pusat object pada garis bujur
        private int[] xPoints = new int[NPOINTS];   //posisi titik-titik sudut object bantu pada bidang kartesian searah sumbu axis
        private int[] yPoints = new int[NPOINTS];   //posisi titik-titik sudut object bantu pada bidang kartesian searah sumbu ordinat
        private int side = FIXES_SIZE;              //ukuran panjang sisi setengah diagonal object bantu (jarak garis lurus antara titik pusat dan titik sudut)
        private String label;                       //label dari object
        private Color color = FIXES_COLOR;          //warna dari object

    /* constructor - user defined ctor, no default ctor */
        // <editor-fold defaultstate="collapsed" desc="ctor">
        /**
         * menginstansiasi object OMLabelClover yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi FIXES_SIZE - const private static final int = 16<br />
         * - tidak memiliki label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat clover pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat clover pada koordinat bujur
         */
        public OMLabelClover(float lat, float lon) {
            this(lat, lon, FIXES_SIZE, null, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelClover yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - tidak memiliki label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat clover pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat clover pada koordinat bujur
         * @param side int yang merupakan panjang sisi belah ketupat bagian dalam clover dengan satuan pixel
         */
        public OMLabelClover(float lat, float lon, int side) {
            this(lat, lon, side, null, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelClover yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - tidak memiliki label<br />
         * - memiliki warna color
         * @param lat float yang merupakan posisi titik pusat clover pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat clover pada koordinat bujur
         * @param side int yang merupakan panjang sisi belah ketupat bagian dalam clover dengan satuan pixel
         * @param color java.awt.Color yang merupakan warna dari clover
         */
        public OMLabelClover(float lat, float lon, int side, Color color) {
            this(lat, lon, side, null, color);
        }
        /**
         * menginstansiasi object OMLabelClover yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi FIXES_SIZE - const private static final int = 16<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat clover pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat clover pada koordinat bujur
         * @param label string yang merupakan teks yang akan dikandung oleh label
         */
        public OMLabelClover(float lat, float lon, String label) {
            this(lat, lon, FIXES_SIZE, label, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelClover yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat clover pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat clover pada koordinat bujur
         * @param side int yang merupakan panjang sisi belah ketupat bagian dalam clover dengan satuan pixel
         * @param label string yang merupakan teks yang akan dikandung oleh label
         */
        public OMLabelClover(float lat, float lon, int side, String label) {
            this(lat, lon, side, label, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelClover yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna color
         * @param lat float yang merupakan posisi titik pusat clover pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat clover pada koordinat bujur
         * @param side int yang merupakan panjang sisi belah ketupat bagian dalam clover dengan satuan pixel
         * @param label string yang merupakan teks yang akan dikandung oleh label
         * @param color java.awt.Color yang merupakan warna dari clover
         */
        public OMLabelClover(float lat, float lon, int side, String label, Color color) {
            this.latitude = lat;
            this.longitude = lon;
            this.side = side;
            this.label = label;
            this.color = color;
        }
        // </editor-fold>

    /**
     * Prepare the graphic for rendering. This must be done before calling render()! If a vector graphic has lat-lon components, then we project these vertices into x-y space. For raster graphics we prepare in a different fashion.<br />
     * If the generate is unsuccessful, it's usually because of some oversight, (for instance if proj is null), and if debugging is enabled, a message may be output to the controlling terminal.<br />
     * membangkitkan graphics dan mempersiapkannya untuk rendering bergantung kepada projection saat ini
     * @param prjctn Projection yang merupakan projection saat ini
     * @return boolean : true jika dan hanya jika pembangkitan berhasil dilakukan dan false jika sebaliknya
     */
    @Override
    public boolean generate (Projection prjctn) {
        Point point = prjctn.forward(this.latitude, this.longitude);

        this.xPoints[0] = point.x;
        this.yPoints[0] = point.y + (int)(this.side / 2);

        this.xPoints[1] = point.x + (int)(this.side / 2);
        this.yPoints[1] = point.y;

        this.xPoints[2] = point.x;
        this.yPoints[2] = point.y - (int)(this.side / 2);

        this.xPoints[3] = point.x - (int)(this.side / 2);
        this.yPoints[3] = point.y;
    
        return (true);
    }

    /**
     * Paint the graphic. This paints the graphic into the Graphics context. This is similar to paint() function of java.awt.Components. Note that if the graphic has not been generated, it will not be rendered.<br />
     * This method used to be abstract, but with the conversion of OMGraphics to internally represent themselves as java.awt.Shape objects, it's a more generic method. If the OMGraphic hasn't been updated to use Shape objects, it should have its own render method.<br />
     * melakukan rendering clover jika dan hanya jika graphics sudah dibangkitkan
     * @param graphics Graphics yang merupakan konteks clover yang akan dirender
     */
    @Override
    public void render (Graphics graphics) {
        Graphics2D g2d = (Graphics2D) graphics;
        g2d.setColor(this.color);

        g2d.drawArc(xPoints[0], yPoints[0], side, side, 90, 90);
        g2d.drawArc(xPoints[1], yPoints[1], side, side, 180, 90);
        g2d.drawArc(xPoints[2], yPoints[2], side, side, 270, 90);
        g2d.drawArc(xPoints[3], yPoints[3], side, side, 0, 90);

        if (this.label != null) {
            FontMetrics fm = g2d.getFontMetrics();
            int w = fm.stringWidth(this.label);
            int h = fm.getHeight();
            
            g2d.drawString(this.label, this.xPoints[0] - (int)(w / 2), this.yPoints[0] + h);
        }
    }
}
